# 面向英特尔® 以太网设备的远程直接内存访问 (RDMA)

远程直接内存访问（RDMA）允许网络设备与另一台系统的应用程序内存之间直接传送数据，并在某些网络环境中增加吞吐量和降低延迟。

- 英特尔® 以太网 800 系列设备支持 iWARP 和 RoCEv2。
- 英特尔® 以太网 X722 系列设备仅支持 iWARP。

主要的区别是 iWARP 通过 TCP 执行 RDMA，而 RoCEv2 则使用 UDP。

在配备 RDMA 功能的设备上，以下操作系统上支持 RDMA：

- Linux*
- FreeBSD*
- VMware* ESXi*
- Microsoft* Windows Server*

为了避免因丢弃的数据包导致的性能下降，在所有网络接口和交换机上启用链路级流量控制或优先级流量控制。

| 注意： 在运行 Microsoft Windows Server 操作系统的系统上，启用 *QoS/优先级流量控制将禁用链路级别流量控制。 基于英特尔® 以太网 800 系列的设备以超过 4 个端口的多端口模式操作时不支持 RDMA。 在 Linux 系统上，RDMA 与绑定不兼容。如果启用了 RDMA，结合将不工作。

## Linux 或 FreeBSD 上的 RDMA

对于支持 Linux 或 FreeBSD 上 RDMA 的英特尔以太网设备，请使用下表中显示的驱动程序。

设备 | Linux | FreeBSD | 支持的协议
--- | --- | --- | ---
基础驱动程序 | RDMA 驱动程序 | 基础驱动程序 | RDMA 驱动程序
英特尔® 以太网 800 系列 | ice | irdma | ice | irdma | RoCEv2, iWARP
英特尔® 以太网 X722 系列 | i40e | irdma | ixl | iw_ixl | iWARP

##### 基本安装说明

对于较高级别，安装和配置 Linux 或 FreeBSD 上的 RDMA 包含以下步骤：请参阅相应 RDMA 驱动程序压缩包内的自述文件，了解完整详细信息。

1. 安装基础驱动程序。
2. 安装 RDMA 驱动程序。
3. 安装并修补任何用户模式的 RDMA 库。具体步骤因操作系统而异；请参阅 RDMA 驱动程序自述文件了解详细信息。
4. 在设备上启用流量控制。请参阅基础驱动程序自述文件，以了解详细信息和受支持模式。
5. 如果要使用 RoCE，请在设备上启用流量控制（PFC 或 LFC）和系统所连接的端点。请参阅交换机文档和《针对 RDMA 用例的英特尔® 以太网 800 系列 Linux 流量控制配置指南》（面向 Linux），以了解详细信息。

### 面向 Linux 中虚拟环境的 RDMA

基于英特尔以太网 800 系列的设备，在受支持的 Windows 或 Linux 主机上支持 Linux VF 下的 RDMA。有关如何在 Linux VF 中加载和配置 RDMA 的更多信息，请参阅 Linux RDMA 驱动程序压缩包中的自述文件。

## Microsoft Windows 上的 RDMA

### 适用于网络直接 (ND) 用户模式应用程序的 RDMA

网络直接 (ND) 允许用户模式应用程序使用 RDMA 功能。

| 注：用户模式应用程序可能具有诸如 Microsoft HPC 包或英特尔 MPI 库之类的先决条件，请参阅应用程序文档以了解详细信息。

#### RDMA 用户模式安装

英特尔® 以太网用户模式 RDMA 提供程序受 Microsoft Windows Server 2012 R2 及更高版本的支持。

按照以下步骤安装用户模式网络直接功能。

1. 从安装介质运行 Autorun.exe 以启动安装程序，然后选择”安装驱动程序和软件”，并接受许可协议。
2. 在安装选项屏幕上，选择“英特尔® 以太网用户模式 RDMA 提供程序”。
3. 在 RDMA 配置选项屏幕上，选择“启用跨 IP 子网的 RDMA 路由”（如果需要）。请注意，在基础驱动程序安装过程中，即使未选择用户模式 RDMA，此选项仍会显示，因为此选项也适用于网络直接内核功能。
4. 如果 Windows 防火墙已安装，并处于活动状态，则选择“在 Windows 防火墙中创建一条英特尔® 以太网 RDMA 端口映射服务规则”，并选择要对其应用该规则的网络。

   | 注：如果 Windows 防火墙被禁用，或者您使用的是第三方防火墙，您将需要手动添加此规则。

5. 继续安装驱动程序和软件。

### RDMA 网络直接内核 (NDK)

RDMA 网络直接内核（NDK）功能包含在英特尔基础网络驱动程序中，并不需要安装额外的功能。

#### 跨 IP 子网的 RDMA 路由

如果你想跨子网允许 NDK 的 RDMA 功能，您需要在基础驱动程序安装过程中在 RDMA 配置选项屏幕上选择“启用跨 IP 子网的 RDMA 路由”。

### 在 Microsoft Windows Server 操作系统上启用优先级流量控制 (PFC)

为避免因丢弃数据包导致的性能下降，请在所有网络接口和交换机上启用优先级流量控制 (PFC) 或链路级流量控制。

| 注意：在运行 Microsoft Windows Server 操作系统的系统上，启用“QoS/优先级流量控制”将禁用链路级流量控制。

使用以下 PowerShell* 命令在 Microsoft Windows Server 上启用 PFC：

`Install-WindowsFeature -Name Data-Center-Bridging -IncludeManagementTools
New-NetQoSPolicy "SMB" -NetDirectPortMatchCondition 445 -PriorityValue8021Action 3
Enable-NetQosFlowControl -Priority 3
Disable-NetQosFlowControl -Priority 0,1,2,4,5,6,7
New-NetQosTrafficClass -Name "SMB" -Priority 3 -BandwidthPercentage 60 -Algorithm ETS
Set-NetQosDcbxSetting -Willing $FALSE
Enable-NetAdapterQos -Name "Slot1 4 2 Port 1"`

### 使用 Microsoft PowerShell 验证 RDMA 操作

您可以使用以下 Microsoft PowerShell 命令检查 RDMA 是否已在网络接口中启用：

`Get-NetAdapterRDMA`

使用以下的 PowerShell 命令检查网络接口是否与 RDMA 兼容，以及多通道是否已启用：

`et-SmbClientNetworkInterface`

使用以下命令 PowerShell 命令检查网络直接是否已在操作系统中启用：

`Get-NetOffloadGlobalSetting | 选择 NetworkDirect`

使用 netstat 以确保每个具备 RDMA 功能的网络接口在端口 445 上有一个侦听器。（支持 RDMA 的 Windows 客户端操作系统可能不标明侦听器）。例如：

`netstat.exe -xan | ? {$_ -match "445"}`

### 面向 Windows 虚拟环境的 RDMA

要在连接到 VMSwitch 的虚拟适配器上启用 RDMA 功能，必须：

- 在每个端口上启用 SR-IOV（单根 I/O 虚拟化）和 VMQ（虚拟机队列）高级属性。
- 设置随 RDMA 功能启用的 VF 数。您最多可以随 RDMA 功能启用 32 个 VF。

在某些情况下，可能会默认为禁用这些设置。您可以在英特尔 PROSet ACU 的“适配器设置”面板中、适配器属性对话框的“高级”选项卡中，或使用以下 PowerShell 命令来手动设置这些选项：

`Set-NetAdapterAdvancedProperty -Name <nic_name> -RegistryKeyword *SRIOV -RegistryValue 1`

`Set-NetAdapterAdvancedProperty -Name <nic_name> -RegistryKeyword *VMQ -RegistryValue 1`

`Set-NetAdapterAdvancedProperty -Name <nic_name> -RegistryKeyword RdmaMaxVfsEnabled -RegistryValue <1-32>`

### 配置 RDMA 来宾支持（NDK 模式 3）

NDK 模式 3 允许内核模式 Windows 组件在 Hyper-V 来宾分区中使用 RDMA 功能。要在英特尔以太网设备上启用 NDK 模式 3，请执行以下操作：

1. 在系统的 BIOS 或 UEFI 中启用 SR-IOV。
2. 在设备上启用 SR-IOV 高级设置。
3. 要在与设备绑定的 VMSwitch 上启用 SR-IOV，对同一个设备上的所有物理功能执行以下操作：
   `New-VMSwitch -Name <switch_name> -NetAdapterName <device_name>`
   `-EnableIov $true`
4. 通过设置“RdmaMaxVfsEnabled”高级设置来配置设备上的 RDMA 虚函数 (VF) 的数目。所有物理函数都必须设置为相同的值。该值是在整个设备中同一时间内具有 RDMA 能力的 VF 的最大数目。启用更多的 VF 将限制来自物理函数 (PF) 和其他 VF 的 RDMA 资源。
   `Set-NetAdapterAdvancedProperty -Name <device_name> -RegistryKeyword RdmaMaxVfsEnabled -RegistryValue <Value: 0 - 32>`
5. 禁用主机上的所有 PF 适配器并重新予以启用。对于更改注册表关键字 “RdmaMaxVfsEnabled”，或者创建或销毁 VMSwitch，这是必需的。
   `Get-NetAdapterRdma | Disable-NetAdapter`
   `Get-NetAdapterRdma | Enable-NetAdapter`
6. 为需要 RDMA VF 支持的 VM 创建 VM 网络适器。
   `Add-VMNetworkAdapter -VMName <vm_name> -VMNetworkAdapterName <device_name> -SwitchName <switch_name>`
7. 如果计划在来宾分区上使用 Microsoft Windows 10 Creators Update (RS2) 或更高版本，则在主机上输入以下命令来设置 VM 网络适配器上的 RDMA 重量：
   `Set-VMNetworkAdapterRdma -VMName <vm_name> -VMNetworkAdapterName <device_name> -RdmaWeight 100`
8. 在 VM 网络适配器上设置 SR-IOV 权重（注：在将 RdmaWeight 设置为 0 之前，必须先将 SR-IOV 权重设置为 0）：
   `Set-VMNetworkAdapter -VMName <vm_name> -VMNetworkAdapterName <device_name> -IovWeight 100`
9. 在 VM 中使用 PROSET 安装程序安装 VF 网络适配器。
10. 使用 VM 中的 PowerShell 在 VF 驱动程序和 Hyper-V 网络适配器上启用 RDMA：
    `Set-NetAdapterAdvancedProperty -Name <device_name> -RegistryKeyword RdmaVfEnabled -RegistryValue 1`
    `Get-NetAdapterRdma | Enable-NetAdapterRdma`

### 适用于 NDK 的 RDMA 功能，如 SMB 直接（服务器消息块）等

NDK 允许 Windows 组件（如 SMB 直接存储）使用 RDMA 功能。

#### 测试 NDK：带 DiskSPD 的 Microsoft Windows SMB Direct

本节概述了我们推荐的在 Microsoft Windows 操作系统上测试适用于英特尔以太网功能和性能的 RDMA 的方法。

注：由于 SMB 直接是存储工作负载，因此基准测试的性能可能仅限于存储设备的速度，而不是被测试的网络接口。英特尔建议尽可能使用最快的存储，以对所测试的网络设备的真实功能进行测试。

测试说明：

1. 设置并连接至少两台运行受支持的 Microsoft Windows Server 操作系统的服务器，且每台服务器至少有一个具备 RDMA 功能的英特尔® 以太网设备。
2. 在指定为 SMB 服务器的系统上设置一个 SMB 共享。注：基准测试的性能可能仅限于存储设备的速度，而不是被测试的网络接口。存储的设置不在本文的范围之内。您可以使用以下的 PowerShell 命令：
   `New-SmbShare -Name <SMBsharename> -Path <SMBsharefilepath> -FullAccess <domainname>\Administrator,Everyone`
   例如：
   `New-SmbShare -Name RAMDISKShare -Path R:\RAMDISK -FullAccess group\Administrator,Everyone`
3. 从此处下载并安装 Diskspd Microsoft 实用程序：https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223
4. 使用 CMD 或 Powershell，cd 到 DiskSpd 文件夹并运行测试。（参考 Diskspd 文档以了解关于参数的更多信息）
   例如：将块大小设置为 4K，运行测试 60 秒钟，禁用所有硬件和软件缓存，测量和显示延迟统计数据，每目标利用 16 个重叠 IO 和 16 个线程，随机 0% 写入和 100% 读取，并创建一个 10GB 测试文件“\\<SMBserverTestIP>\<SMBsharename>\test.dat”：
   `.\diskspd.exe -b4K -d60 -h -L -o16 -t16 -r -w0 -c10G \\<SMBserverTestIP>\<SMBsharename>\test.dat`
5. 确认 RDMA 通信正在使用“RDMA 活动”和“SMB 直接连接”之类的性能计数器。参考 Microsoft 文档以了解更多细节。

## 客户支持

- 英特尔的网络支持主网站：http://support.intel.com
- 网络产品信息：http://www.intel.com/network

## 法律声明 / 免责声明

版权所有 (C) 2019 - 2022，英特尔公司。保留所有权利。

英特尔公司对本文档中的错误和遗漏不负责任。英特尔公司对更新本文档中的信息不作任何承诺。

英特尔是英特尔公司在美国和/或其它国家（地区）的商标。

*文中涉及的其它名称及商标属于各自所有者资产。

本软件根据许可提供，仅允许按照许可条款使用或复制。本手册中的信息仅供参考，可能随时变更而不另行通知，并且不得将其视为英特尔公司的承诺。对于本文或提供的与本文有关的任何软件中可能出现的任何错误或不准确之处，英特尔公司概不承担任何责任或义务。除非许可证允许，在未获得英特尔公司明确的书面同意前提下，不得以任何形式或任何手段复制或传输本文档的任何部分，也不得将其存储到检索系统中。